home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Unsupported Libraries / WWWAnchorIO_Lib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-21  |  4.7 KB  |  257 lines  |  [TEXT/MPS ]

  1. /*
  2.  * CustomIO_Lib.c
  3.  *
  4.  *    Demo/Template for writing custom IO functions
  5.  *    
  6.  *    Custom Attribute example
  7.  */
  8. #include "QD3D.h"
  9. #include "QD3DPick.h"
  10. #include "QD3DSet.h"
  11. #include "QD3DIO.h"
  12. #include "QD3DGroup.h"
  13. #include "WWWAnchorIO_Lib.h"
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17.  
  18. /*
  19.  * Globals
  20.  */
  21. static TQ3ObjectClass gWWWAnchorClass;
  22.  
  23. /*
  24.  * Public Functions
  25.  */
  26. TQ3Boolean WWWAnchor_GetFromObject(
  27.     TQ3Object            object,
  28.     WWWAnchorData        *data)
  29. {
  30.     TQ3SetObject    set;
  31.     TQ3Boolean        result;
  32.     
  33.     data->url = NULL;
  34.     
  35.     
  36.     if ((Q3Object_IsType(object, kQ3ShapeTypeGeometry) == kQ3False) &&
  37.         (Q3Object_IsType(object, kQ3ShapeTypeGroup) == kQ3False))
  38.         return kQ3False;
  39.         
  40.     if (Q3Shape_GetSet(object, &set) == kQ3Failure)
  41.         return kQ3False;
  42.     
  43.     if (set == NULL)
  44.         return kQ3False;    
  45.         
  46.     result =
  47.         (Q3Set_Contains(set, kElementTypeWWWAnchor) == kQ3False) ||
  48.         (Q3Set_Get(set, kElementTypeWWWAnchor, data) == kQ3Failure) ||
  49.         (data->url == NULL) ?
  50.         kQ3False : kQ3True;
  51.  
  52.     Q3Object_Dispose(set);
  53.     
  54.     return result;
  55. }    
  56.  
  57. TQ3Boolean WWWAnchor_GetFromHitData(
  58.     const TQ3HitData    *hitData,
  59.     WWWAnchorData        *data)
  60. {
  61.     /* When the original group is given, add this code:
  62.  
  63.     TQ3GroupObject        group, nextGroup;
  64.     TQ3GroupPosition    *pos;
  65.     long                nPos, i;
  66.     
  67.     if (hitData->validMask & kQ3PickDetailMaskPath)
  68.     {
  69.     
  70.         group    = hitData->path.rootGroup;
  71.         pos        = hitData->path.positions;
  72.         nPos    = hitData->path.depth;
  73.         
  74.         Q3Shared_GetReference(group);
  75.         
  76.         for (i = 0; i < nPos; i++) 
  77.         {
  78.             if (WWWAnchor_GetFromObject(group, data) == kQ3True)
  79.                 return kQ3True;
  80.             if (Q3Group_GetPositionObject(group, pos[i], &nextGroup) == kQ3Failure)
  81.                 break;
  82.             Q3Object_Dispose(group);
  83.             group = nextGroup;
  84.         }
  85.         
  86.         Q3Object_Dispose(group);
  87.     }
  88.     
  89.      */    
  90.     return WWWAnchor_GetFromObject(hitData->object, data);
  91. }
  92.  
  93. /* If the above return kQ3True, call this when you're done with the data */
  94.      
  95. void WWWAnchor_Empty(
  96.     WWWAnchorData        *data)
  97. {
  98.     if (data->url != NULL) {
  99.         free(data->url);
  100.         data->url = NULL;
  101.     }
  102. }
  103.  
  104. /*
  105.  * Static Functions
  106.  */
  107. static TQ3Status WWWAnchor_Traverse(
  108.     WWWAnchorData            *wwwdata,
  109.     TQ3FileObject            file)
  110. {
  111.     TQ3Size        size;
  112.     
  113.     if (wwwdata->url == NULL)
  114.         return kQ3Success;
  115.     
  116.     size = Q3Size_Pad(strlen(wwwdata->url) + 1);
  117.     
  118.     return
  119.         Q3View_SubmitWriteData(file, size, wwwdata, NULL);
  120.         
  121.     //return
  122.     //    Q3FileWriteState_SetObjectWriteData(
  123.     //        file, wwwdata, size);
  124. }
  125.  
  126. static TQ3Status WWWAnchor_Write(
  127.     WWWAnchorData            *wwwdata,
  128.     TQ3FileObject            file)
  129. {
  130.     return 
  131.         Q3String_Write(wwwdata->url, file) == kQ3Success &&
  132.         Q3Comment_Write("url", file) == kQ3Success ? kQ3Success : kQ3Failure;
  133. }
  134.  
  135. static TQ3Status WWWAnchor_ReadData(
  136.     TQ3SetObject            set,
  137.     TQ3FileObject            file)
  138. {
  139.     char                buf[kQ3StringMaximumLength];
  140.     WWWAnchorData        wwwdata;
  141.     
  142.     if (Q3String_Read(buf, NULL, file) == kQ3Failure)
  143.         return kQ3Failure;
  144.  
  145.     wwwdata.url = buf;
  146.     
  147.     return Q3Set_Add(set, kElementTypeWWWAnchor, &wwwdata);
  148. }
  149.  
  150. static TQ3Status WWWAnchor_CopyAdd(
  151.     WWWAnchorData    *src,
  152.     WWWAnchorData    *dst)
  153. {
  154.     long    i;
  155.     
  156.     if (src->url == NULL)
  157.         return kQ3Failure;
  158.  
  159.     i = strlen(src->url);
  160.     
  161.     if (i == 0)
  162.         return kQ3Failure;
  163.         
  164.     dst->url = malloc(i + 1);
  165.     
  166.     if (dst->url == NULL)
  167.         return kQ3Failure;
  168.         
  169.     strcpy(dst->url, src->url);
  170.     
  171.     return kQ3Success;
  172. }
  173.  
  174. static TQ3Status WWWAnchor_CopyReplace(
  175.     WWWAnchorData    *src,
  176.     WWWAnchorData    *dst)
  177. {
  178.     long    i;
  179.     char    *c;
  180.     
  181.     if (src->url == NULL)
  182.         return kQ3Failure;
  183.  
  184.     i = strlen(src->url);
  185.     
  186.     if (i == 0)
  187.         return kQ3Failure;
  188.         
  189.     c = realloc(dst->url, i + 1);
  190.     
  191.     if (c == NULL)
  192.         return kQ3Failure;
  193.     
  194.     dst->url = c;
  195.         
  196.     strcpy(dst->url, src->url);
  197.     
  198.     return kQ3Success;
  199. }
  200.  
  201. static TQ3Status WWWAnchor_Delete(
  202.     WWWAnchorData    *src)
  203. {
  204.     if (src->url != NULL) 
  205.         free(src->url);
  206.  
  207.     return kQ3Success;
  208. }
  209.  
  210. /*
  211.  * WWWAnchor_MetaHandler
  212.  */
  213. static TQ3FunctionPointer WWWAnchor_MetaHandler(
  214.     TQ3MethodType        methodType)
  215. {
  216.     switch (methodType)
  217.     {
  218.         case kQ3MethodTypeObjectTraverse:
  219.             return (TQ3FunctionPointer) WWWAnchor_Traverse;
  220.         case kQ3MethodTypeObjectWrite:
  221.             return (TQ3FunctionPointer) WWWAnchor_Write;
  222.         case kQ3MethodTypeObjectReadData:
  223.             return (TQ3FunctionPointer) WWWAnchor_ReadData;
  224.         case kQ3MethodTypeElementCopyAdd:
  225.         case kQ3MethodTypeElementCopyGet:
  226.         case kQ3MethodTypeElementCopyDuplicate:
  227.             return (TQ3FunctionPointer) WWWAnchor_CopyAdd;
  228.         case kQ3MethodTypeElementCopyReplace:
  229.             return (TQ3FunctionPointer) WWWAnchor_CopyReplace;
  230.         case kQ3MethodTypeElementDelete:
  231.             return (TQ3FunctionPointer) WWWAnchor_Delete;
  232.         default:
  233.             return (TQ3FunctionPointer) NULL;
  234.     }
  235. }
  236.  
  237. /*
  238.  * WWWAnchor_Register
  239.  */
  240. TQ3Status WWWAnchor_Register(
  241.     void)
  242. {
  243.     gWWWAnchorClass = 
  244.         Q3ElementClass_Register(
  245.             kElementTypeWWWAnchor,
  246.             kElementNameWWWAnchor,
  247.             sizeof(WWWAnchorData),
  248.             WWWAnchor_MetaHandler);
  249.  
  250.     return (gWWWAnchorClass == NULL ? kQ3Failure : kQ3Success);
  251. }
  252.  
  253. TQ3Status WWWAnchor_UnRegister(
  254.     void)
  255. {
  256.     return Q3ObjectClass_Unregister(gWWWAnchorClass);
  257. }